package compositePattern

/**
 * 组合模式,用来描述部分与整体的关系.
 *
 * 将对象组合成树形结构以表示"部分--整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性.
 *
 * 示例,使用组合模式实现公司各部门层次关系
 *
 * 在安卓中View和ViewGroup就是组合模式的实践方式,一个ViewGroup作为一个根节点,下面的ViewGroup为树枝结点,View作为叶子结点
 */
fun main() {
    //CEO
    val root = ConcreteCompany("张三", "CEO")
    //部门经理
    val developDep = ConcreteCompany("李四", "研发部经理")
    val saleDep = ConcreteCompany("王五", "销售部经理")
    val financeDep = ConcreteCompany("赵六", "财务部经理")

    //部门员工
    val e1 = Employee("A", "研发部")
    val e2 = Employee("B", "销售部")
    val e3 = Employee("B", "财务部")

    root.add(developDep)
    root.add(saleDep)
    root.add(financeDep)

    developDep.add(e1)
    saleDep.add(e2)
    financeDep.add(e3)

    PrintUtil.print(root.getInfo())
    display(root)
}

/**
 * 递归遍历
 */
fun display(root: ConcreteCompany) {
    root.getChild().forEach {
        if (it is Employee) {
            PrintUtil.print(it.getInfo())
        } else {
            PrintUtil.print(it.getInfo())
            display(it as ConcreteCompany)
        }
    }
}
